/**
 * 二维平面上给定N个点。然后从(Sx, Sy)出发，走M步。
 * 每次朝东西南北四个方向之一走Ci步。问行进途中经过多少个固定点（不能重复计数）。
 * 首先将点分别按照x和y坐标排序。
 * 每一次行进，显然其中一个坐标是固定的，假设x是固定的，则y的范围是[lo, up]，
 * 用二分找到在这个区间内包含多少个固定点，对每个固定点依次做标记、删除即可。
 * 每个点做多被删除两次。每次查找操作是log的。因此是O((M+N)logN)的。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using Real = long double;
using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using i128 = __int128_t;

int N, M;
llt Sx, Sy;
map<llt, map<llt, vi>> XMap, YMap;
vi Flag;

void work(){
    cin >> N >> M >> Sx >> Sy;
    for(int x,y,i=1;i<=N;++i){
        cin >> x >> y;
        XMap[x][y].emplace_back(i);
        YMap[y][x].emplace_back(i);
    }
    Flag.assign(N + 1, 0);

    int ans = 0;
    for(int i=1;i<=M;++i){
        char d;
        llt c;
        cin >> d >> c;
        if('U' == d){
            llt up = Sy + c;
            llt lo = Sy;
            llt x = Sx;
            auto & m = XMap[x];
            auto it = m.lower_bound(lo);
            auto et = m.upper_bound(up);
            while(it != et){
                for(auto j : it->second){
                    if(Flag[j] == 0){
                        Flag[j] = 1;
                        ans += 1;
                    }
                }
                it = m.erase(it);
            }
            Sy = up;
        }else if('D' == d){
            llt up = Sy;
            llt lo = Sy - c;
            llt x = Sx;
            auto & m = XMap[x];
            auto it = m.lower_bound(lo);
            auto et = m.upper_bound(up);
            while(it != et){
                for(auto j : it->second){
                    if(Flag[j] == 0){
                        Flag[j] = 1;
                        ans += 1;
                    }
                }
                it = m.erase(it);
            }
            Sy = lo;
        }else if('L' == d){
            llt up = Sx;
            llt lo = Sx - c;
            llt y = Sy;
            auto & m = YMap[y];
            auto it = m.lower_bound(lo);
            auto et = m.upper_bound(up);
            while(it != et){
                for(auto j : it->second){
                    if(Flag[j] == 0){
                        Flag[j] = 1;
                        ans += 1;
                    }
                }
                it = m.erase(it);
            }
            Sx = lo;
        }else if('R' == d){
            llt up = Sx + c;
            llt lo = Sx;
            llt y = Sy;
            auto & m = YMap[y];
            auto it = m.lower_bound(lo);
            auto et = m.upper_bound(up);
            while(it != et){
                for(auto j : it->second){
                    if(Flag[j] == 0){
                        Flag[j] = 1;
                        ans += 1;
                    }
                }
                it = m.erase(it);
            }
            Sx = up;
        }else{
            assert(0);
        }

    }
    cout << Sx << " " << Sy << " " << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}